package cn.dduan.fool;

import cn.dduan.fool.runnable.MyRunnable;
import cn.dduan.fool.thread.MyThread;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class ThreadFoolApplication {
    public static void main(String[] args) {
        log.info("fool-thread success");

        // 测试 Thread 实现多线程
        MyThread t = new MyThread();
        t.start();
        /**
         * 注意：
         * 1、t.run()：不会启动线程，只是普通的调用方法而已，不会分配新的分支栈（这种方式就是单线程）
         * 2、t.start()：方法的作用是：启动一个分支线程，在JVM中开辟一个新的栈空间，这段代码任务完成之后，瞬间就结束了
         *    启动成功的线程会自动调用run方法，并且run方法在分支栈的栈底部（压栈）
         *    run方法在分支栈的栈底部，main方法在主栈的栈底部。run和main是平级的
         * 3、t.stop()：已过时（不建议使用）
         *    直接将线程杀死了，线程没有保存的数据将会丢失，不建议使用。
         * 4、t.run = false：终止线程
         * 5、t.getPriority()：获得线程优先级
         * 6、t.setPriority(2)：设置线程优先级
         *    最低优先级1：Thread.MIN_PRIORITY
         *    默认优先级5：Thread.NORM_PRIORITY
         *    最高优先级10：Thread.MAX_PRIORITY
         * 7、t.join()：将一个线程合并到当前线程中，当前线程受阻塞，加入的线程执行直到结束
         */

        // 测试 Runnable 实现多线程
        Thread r = new Thread(new MyRunnable());
        r.start();

        // 采用匿名内部类实现多线程
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 1000; i++) {
                    Thread currentThread = Thread.currentThread();
                    log.info("{} : {}", currentThread.getName(), i);
                    log.info("匿名内部类实现-分支线程：{}", i);
                }
            }
        });
        t1.start();
        /**
         * 注意：实现接口比较常用，因为一个类实现了接口，它还可以去继承其它的类，更灵活
         */

        // 运行在主线程中
        for (int i = 0; i < 1000; i++) {
            log.info("主线程：{}", i);
        }
    }
}
